//package cn.itbox.example.application.test.four;
//
//import org.apache.dubbo.common.URL;
//import org.apache.dubbo.common.utils.StringUtils;
//import org.apache.dubbo.rpc.Invocation;
//import org.apache.dubbo.rpc.Invoker;
//import org.apache.dubbo.rpc.cluster.ClusterInvoker;
//import org.apache.dubbo.rpc.support.RpcUtils;
//
//import java.util.List;
//import java.util.concurrent.ThreadLocalRandom;
//
//import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
//import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_SERVICE_REFERENCE_PATH;
//import static org.apache.dubbo.rpc.cluster.Constants.*;
//import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_WARMUP;
//
//public class RandomLoadBalance {
//
//
//    public static void main(String[] args) {
//
//        //分布式事务
//    }
//
//
//    public <T> Invoker<T> doSelect(List<Invoker<T>> invokers,URL url ,Invocation invocation) {
//
//        int length=invokers.size();
//
//        if(!needWeightLoadBalance(invokers,invocation)){
//            return  invokers.get(ThreadLocalRandom.current().nextInt(length));
//        }
//
//        //Every invoker has the same weight?
//        boolean sameWeight=true;
//        //the maxWeight of every invoker ,the minWeight=0 or the maxWeight of the last invoker
//        int[] weights=new int[length];
//
//        //The sum of weights
//        int totalWeight=0;
//
//        for(int i=0;i<length;i++){
//            int weight=getWeight(invokers.get(i),invocation);
//
//            //Sum
//            totalWeight+=weight;
//
//            //save for later use
//
//        }
//    }
//
//
//
//    /**
//     * Get the weight of the invoker's invocation which takes warmup time into account
//     * if the uptime is within the warmup time, the weight will be reduce proportionally
//     *
//     * @param invoker    the invoker
//     * @param invocation the invocation of this invoker
//     * @return weight
//     */
//
//    protected  int getWeight(Invoker<?> invoker ,Invocation invocation){
//        int weight;
//        URL url=invoker.getUrl();
//        if(invoker instanceof ClusterInvoker){
//            url = ((ClusterInvoker<?>) invoker).getRegistryUrl();
//        }
//
//        //mutiple registry sennario load balance among multiple registries
//        if(REGISTRY_SERVICE_REFERENCE_PATH.equals(url.getServiceInterface())){
//            weight=url.getParameter(WEIGHT_KEY,DEFAULT_WEIGHT);
//        }else{
//            weight=url.getMethodParameter(RpcUtils.getMethodName(invocation),WEIGHT_KEY,DEFAULT_WEIGHT);
//
//            if(weight>0){
//                long timestamp = invoker.getUrl().getParameter(TIMESTAMP_KEY, 0L);
//
//            }
//        }
//    }
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//    protected int getWeight(Invoker<?> invoker, Invocation invocation) {
//
//        // Multiple registry scenario, load balance among multiple registries.
//        if (REGISTRY_SERVICE_REFERENCE_PATH.equals(url.getServiceInterface())) {
//            weight = url.getParameter(WEIGHT_KEY, DEFAULT_WEIGHT);
//        } else {
//            weight = url.getMethodParameter(RpcUtils.getMethodName(invocation), WEIGHT_KEY, DEFAULT_WEIGHT);
//            if (weight > 0) {
//                long timestamp = invoker.getUrl().getParameter(TIMESTAMP_KEY, 0L);
//                if (timestamp > 0L) {
//                    long uptime = System.currentTimeMillis() - timestamp;
//                    if (uptime < 0) {
//                        return 1;
//                    }
//                    int warmup = invoker.getUrl().getParameter(WARMUP_KEY, DEFAULT_WARMUP);
//                    if (uptime > 0 && uptime < warmup) {
//                        weight = calculateWarmupWeight((int) uptime, warmup, weight);
//                    }
//                }
//            }
//        }
//        return Math.max(weight, 0);
//    }
//
//
//
//
//    private <T> boolean needWeightLoadBalance(List<Invoker<T>> invokers,Invocation invocation){
//        Invoker<T> invoker=invokers.get(0);
//        URL invokerUrl=invoker.getUrl();
//
//        if(invoker instanceof ClusterInvoker){
//            invokerUrl=((ClusterInvoker<?>)invoker).getRegistryUrl();
//        }
//
//        //Multiple registry scenario load balance among multiple registries
//        if(REGISTRY_SERVICE_REFERENCE_PATH.equals(invokerUrl.getServiceInterface())){
//            String weight=invokerUrl.getParameter(WEIGHT_KEY);
//            return StringUtils.isEmpty(weight);
//        }else {
//            String weight=invokerUrl.getMethodParameter(RpcUtils.getMethodName(invocation),WEIGHT_KEY);
//
//            if(StringUtils.isNotEmpty(weight)){
//                return true;
//            }else {
//                String timeStamp=invoker.getUrl().getParameter(TIMESTAMP_KEY);
//                return StringUtils.isEmpty(timeStamp);
//            }
//        }
//    }
//
//}
